// // 任务1：创建一个简单的问候函数
// // 要求：
// // 编写一个函数greet，接受一个名字作为参数，并返回一个问候语，例如：“Hello, [名字]! Welcome to JavaScript.”。
// function greet(name) {
//   console.log(`Hello, ${name}! Welcome to JavaScript.`);
// }
// greet("星河");

// // 任务2：计算数组的平均值
// // 要求：
// // 编写一个函数calculateAverage，接受一个数字数组作为参数，并返回数组的平均值。
// function calculateAverage(arr) {
//   let sum = 0;
//   arr.forEach((item) => {
//     sum += item;
//   });
//   let avg = sum / arr.length;
//   console.log("该数组为:[" + arr + "],数组的平均值为:" + avg);
// }
// calculateAverage([2, 4, 6, 8]);

// // 任务3：检查字符串是否为回文
// // 要求：
// // 编写一个函数isPalindrome，接受一个字符串作为参数，判断该字符串是否为回文（正读和反读相同）。
// function isPalindrome(str) {
//   let reverseStr = str.split("").reverse().join("");
//   console.log(str, str === reverseStr ? "是回文" : "不是回文");
// }
// isPalindrome("abaa");

// // 任务4：实现一个简单的计数器
// // 要求：
// // 使用闭包实现一个简单的计数器，每次调用时返回当前的计数值。
// function counter() {
//   let count = 0;
//   return () => {
//     return (count += 1);
//   };
// }
// const counters = counter();
// console.log(counters());
// console.log(counters());
// console.log(counters());

// // 任务5：过滤数组中的偶数
// // 要求：
// // 编写一个函数filterEvenNumbers，接受一个数字数组作为参数，返回一个只包含偶数的新数组。
// function filterEvenNumbers(arr) {
//   let newArr = [];
//   arr.map((item) => {
//     item % 2 == 0 ? newArr.push(item) : "";
//   });
//   console.log("原数组为:[" + arr + "],只包含偶数的新数组为:[" + newArr + "]");
// }
// filterEvenNumbers([1, 2, 3, 4]);

// // 任务6：实现一个简单的对象工厂
// // 要求：
// // 编写一个函数createPerson，接受name和age作为参数，返回一个包含这些属性的对象。
// function createPerson(name, age) {
//   let person = {
//     name: name,
//     age: age,
//   };
//   console.log("person:", person);
// }
// createPerson("张三", 18);

// // 任务7：递归计算阶乘
// // 要求：
// // 编写一个递归函数factorial，计算一个非负整数的阶乘。
// function factorial(number) {
//   if (number > 1) {
//     let result = 1;
//     for (let i = 1; i <= number; i++) {
//       result *= i;
//     }
//     console.log(number + "的阶乘为:" + result);
//   }
// }
// factorial(3);

// // 任务8：实现一个简单的事件监听器
// // 要求：
// // 编写一个函数addEventListener，模拟HTML元素的事件监听器功能。接受一个事件类型和一个回调函数作为参数，并在触发时调用回调函数。
// function addEventListener() {}

// // 任务9：实现一个简单的Promise
// // 要求：
// // 使用Promise实现一个异步函数fetchData，模拟从服务器获取数据。如果成功，返回一个字符串；如果失败，抛出一个错误。
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const isBoolean = Math.random() > 0.4;
      if (isBoolean) {
        resolve("从服务器获取数据成功");
      } else {
        reject("从服务器获取数据失败");
      }
    }, 2000);
  });
}

fetchData()
  .then((data) => {
    console.log(data);
  })
  .catch((data) => {
    console.log(data);
  });

// // 任务10：实现一个简单的模块
// // 要求：
// // 使用模块模式封装一个mathUtils模块，包含add和multiply两个函数。
// import { add, multiply } from "./mathUtils.js";
// add(1, 1);
// multiply(2, 4);

// // 创建完整nodejs项目，配合git和git忽略文件，创建标准nodejs项目,托管在码云仓库

// // 梳理总结commonJs和ES模块的区别，以及常规用法
// /* 区别及常规用法
//   1.语法差异
//      commonJs模块使用require()导入模块,使用module.exports导出模块
//      ES模块使用import 属性/方法 from '文件路径' 导入模块,使用export default 属性/方法 或者 export let/const/var 变量 或者 export {方法名,变量名 }
//   2.默认模块
//     默认是commonJs模块，如想使用ES模块需在package.json文件添加属性type，值为module即可
//   3.加载机制
//     CommonJS：同步加载模块，模块在被 require() 调用时立即加载和执行。适用于服务器端，因为模块文件通常在本地磁盘上，可快速访问。
//     ES 模块：支持异步加载（浏览器端）和静态加载（Node.js）。支持动态导入，例如 import('some-module')，返回一个 Promise。
// */
